docs(skills): platform skill's Complete Working Example prints the scaffolder's TypeScript range - #16763
Conversation
…affolder's TypeScript range The `package.json` block in `skills/objectstack-platform/SKILL.md` is the on-ramp an AI author copies for a new project. Its `@objectstack/*` ranges are maintained with the release; its `typescript` range was not, and still taught the value the scaffold emission policy retired in #16485. Read at flight time from `SCAFFOLD_TYPESCRIPT_RANGE` (`packages/cli/src/commands/init.ts`), which all three scaffolders emit from — never copied from the card or a comment, since restating a decaying constant is the defect this change closes. Byte-neutral: the block stays complete and no other value in it moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
维护者速读(终稿 · skills 席,2026-09-08T04:27Z)改了什么 — 已发布技能 为什么改 — 这个块是 AI 写新项目时照抄的入口;块里 风险与代价(含回滚) — 风险极低:文档里的一个版本范围,无运行时、无发布物移动(实测无任何包的 席位意见 — ACCEPT。值已对;把「权威在哪」交给门禁而不是散文,是四轴同向的选择。 你要做的 — 受管面( Generated by Claude Code |
Fixes #16655
Draft, and it stays draft:
skills/**is a governed surface, so a human merge isthe review record. No seat flips it ready, enqueues it, or arms auto-merge.
What changed
One value, on one line.
skills/objectstack-platform/SKILL.md:608, inside the"Complete Working Example"
package.jsonblock, taughttypescript: "^6.0.0"—the range the scaffold emission policy retired in #16485. It now prints the range
all three scaffolders actually emit.
The value was read at flight time, never copied from the card or a comment:
packages/cli/src/commands/init.ts:312—export const SCAFFOLD_TYPESCRIPT_RANGE = '^5.3.0';check:scaffold-emission-policy, whose own verdictline prints
SCAFFOLD_TYPESCRIPT_RANGE=^5.3.0.The block stays complete and no other value in it moves. The four
@objectstack/*ranges beside it were re-checked and are current —
spec,runtime,driver-memory,plugin-hono-serverandcliare all at17.3.0, which^17.0.0admits. Nothing to file there.
What is deliberately not here
The dispatched shape was triage's compromise: print the value and add one
adjacent sentence naming
SCAFFOLD_TYPESCRIPT_RANGEas the authority. Thatsentence is deliberately not in this PR, by a seat disposition recorded on the
card. Two things decided it, and the value half is the whole of the card.
It does not fit, and that ceiling is a human floor. The published-skills token
ratchet holds this file at 12980 tokens against a ceiling of 12984 — headroom 4
tokens, 18 bytes. The shortest wording that names the constant and the file it
lives in,
is 85 bytes and lands the file at 13001 tokens, 17 over. No wording naming a
25-character constant plus a 33-character path fits in 18 bytes. Raising a ceiling
is not something a seat requests against a human floor, and deleting content to pay
for a sentence that should not land is not a trade worth making.
It is the wrong instrument anyway, on all four axes:
correct value, and that is what landed.
restatements rot — which is the entire lesson this card is about. The shape that
does not rot is a gate reading the fence.
sentence catches nothing.
customer, yet every session that loads this skill would pay its 17 tokens forever.
That is a token tax levied on the wrong audience.
The mechanical pin — extending
check:scaffold-emission-policyto read this fence —is tracked separately as #16767. Triage's starred option 2 (stop printing the range
at all) stays declined on its own stated reason: the block is titled "Complete
Working Example" and would stop being complete.
Verification
Gate families. Derived in-worktree with
node scripts/pm/dispatch-gates.mjs --commands(no paths passed; the tool takes its own change set from the merge base)and reconciled with
--ranplus--repo objectstack-ai/objectstack:All 21 exited 0. The ones that speak to this diff:
node scripts/check-skills-token-ratchet.mjs✓ check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted.pnpm --filter @objectstack/spec run check:skill-docs✓ content/docs/ai/skills-reference.mdxpnpm check:skill-identifier-livenesscheck-skill-identifier-liveness OK — Leg 1: 465 citation(s) over 46 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s).pnpm check:skill-compatibility✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 80 workspace packagespnpm check:corpus-claim-driftOK(published-skills claim sweep)pnpm check:nul-bytes✓ check-nul-bytes --self-test: 75 assertions over a temp git repo (real scan() path)pnpm check:doc-authoring✓ doc authoring guard: … 829 pinned site(s) across 231 file(s), no growthOne gate needed a build before it measured anything:
pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 —PREREQUISITE NOT MET, which is the gate's own code for nothing was measured,not a finding. After
turbo run build --filter=@objectstack/formula --filter=@objectstack/lintit exited 0 with three green verdict lines. Both runs arerecorded rather than only the second, since an exit 3 is a real NOT-MEASURED state
and hiding it would make the sweep read as one clean pass.
Governed classification, asserted rather than assumed:
Merge cleanliness.
git merge-tree --write-tree origin/main HEADagainstorigin/main73053ed27exits 0 and writes a tree with no conflict rows.skills/**carries no
merge=os-regenattribute, so that reading is a real textual merge and nota driver deferral.
Budget, for the record. The landed change is byte-identical in size — 51918
bytes before and after, because
^6.0.0and^5.3.0are the same length. File lines1223 → 1223; the sum of all 11
skills/**/SKILL.mdfiles 6853 → 6853; this file'stokens 12980 → 12980 against its 12984 ceiling; the ratcheted authored bundle 139938 →
139938 against 157098. Nothing in the ratchet moved.
skip-changeset. Measured, not assumed: no package manifest'sfiles[]names askillspath, the repo root isprivate: true, and no package'ssrc/ordist/embeds this SKILL.md's content — grepped with a positive control that does hit
(
ObjectSchemainpackages/spec/dist) to prove the instrument was answering.Nothing published moves, so the label is correct.
维护者速读(草稿)
改了什么 —— 已发布技能
objectstack-platform的「Complete Working Example」里那份package.json,typescript一行从退役的^6.0.0改成三个 scaffolder 实际发出的值。值是飞行时从
SCAFFOLD_TYPESCRIPT_RANGE常量现读的,没有从卡片或任何评论抄。一行一值,块内其它内容一字未动,文件字节数前后相同。
为什么改 —— 这个块是 AI 写新项目时照抄的入口。块里
@objectstack/*全是当前值,说明它随发布维护;只有
typescript这一行掉队了。两个项目同一天创建却声明不同的TypeScript 大版本,正是 #16485 要防的结果,而这是那张卡没枚举到的第四个载体。
风险与代价(含回滚) —— 风险极低:改的是文档里的一个版本范围,无运行时、无发布物
移动(已实测:没有任何包的
files[]覆盖skills/)。回滚 = revert 这一个提交,一行。「权威声明」句按席位裁量不落,四轴理由见卡与上文「What is deliberately not here」;
不腐烂的形态是门禁读这段 fence,机械 pin 已另立一卡(#16767)。
席位意见 ——
你要做的 —— 受管面:请人工合并本 PR(合并即关卡)。⛔ 不走合并队列、不 auto-merge。
验收备注
Out-of-scope, noted and not filed:
content/docs/protocol/kernel/plugin-spec.mdx:708carrier prints"typescript": "^5.0.0"— a third value, disagreeing with both the scaffolderand this skill. It is a
content/docs/**carrier, routed todomain:devxby thiscard's own triage, and the PM has already filed it. Not touched here. Carrier for
it: the
domain:devxcard the PM filed.grep -rn '"typescript"' skills/ content/ packages/*/src/templates/— and findsone carrier under
skills/(this one, now fixed) and no fifth carrier. Thepackages/create-objectstack/src/templates/blank/package.json:27template alreadyreads
^5.3.0, agreeing with the scaffolder; the threecontent/docs/references/**hits areformatsenum rows, not version ranges.typescript6.0.3while the scaffold policyemits
^5.3.0to customer projects. That is a compatibility floor for generatedapps versus the monorepo's own build, not a contradiction, and no ruling on this
card is disturbed by it. Noted so the next reader does not re-discover it as a
finding. Carrier: none.
Generated by Claude Code